const hasOwnProperty = Object.prototype.hasOwnProperty
const toString = Object.prototype.toString

export function hasOwn (obj: Object | any[], key: string): boolean {
  return hasOwnProperty.call(obj, key)
}

/** 
 * Plain Object 指的是通过 字面量形式 {} 或 new Object() 形式定义的对象。
 * 以下代码函数直接摘自 Vue，使用的是  Object.prototype.toString 判断对象类型的方法。
 * 详细参考：https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
 * 
 * 这个命名是不准确的，关于 Plain Object 的判断可参考：
 * 
 * function isObject(o) {
 *  return Object.prototype.toString.call(o) === '[object Object]';
 * }

 * export function isPlainObject(o) {
 *   var ctor,prot;
 * 
 *   if (isObject(o) === false) return false;
 * 
 *   // If has modified constructor
 *   ctor = o.constructor;
 *   if (ctor === undefined) return true;
 * 
 *   // If has modified prototype
 *   prot = ctor.prototype;
 *   if (isObject(prot) === false) return false;
 * 
 *   // If constructor does not have an Object-specific method
 *   if (prot.hasOwnProperty('isPrototypeOf') === false) {
 *     return false;
 *   }
 * 
 *   // Most likely a plain Object
 *   return true;
 * };
 * 
 * 以上来自：
 * https://github.com/jonschlinkert/is-plain-object
 * https://www.npmjs.com/package/is-plain-object
 * 
 * 不过 toString方式 依然可以有效区分 Date，String 之类的对象。
 * 所以我们依然沿用 Vue 所使用的函数名
 */
export function isPlainObject (obj: any): boolean {
  return toString.call(obj) === '[object Object]'
}
